/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.jeeunit.config;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.tewi.jeeunit.utils.FileUtils;

/**
 * Kopiuje konfigurację serwera aplikacyjnego z archiwum
 * @author Marcin Kwapisz
 */
public class CopyServerConfiguration implements ServerConfigurationStrategy {

    /**
     * Logger
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(CopyServerConfiguration.class);

    /**
     * Przygotowuje konfigurację serwera aplikacyjnego poprzez skopiowanie plików
     * @param file katalog źródłowy
     * @param srcSubDirectory nazwa podkatalogu znajdującego się w katalogu źródłowym
     * @param destSubDirectory nazwa katalogu docelowego do którego zostaną skopiowane katalogi
     * @throws IOException - w przypadku problemów z tworzeniem katalogu docelowego bądź kopiowaniem plików z katalogu źródłowego
     */
    @Override
    public final void prepareConfiguration(final File file, final String srcSubDirectory, final String destSubDirectory) throws IOException {

        //utwórz ścieżkę do katalogu docelowego.
        final String targetDir = FileUtils.joinPaths(destSubDirectory, srcSubDirectory);
        //jeżeli docelowego katalogu nie ma to go utwórz
        final File targetDirFile = FileUtils.createDirectory(targetDir);

        //utwórz ścieżkę do katalogu źródłowego
        final String sourceDir = FileUtils.joinPaths(file.getAbsolutePath(), srcSubDirectory);
        final File sourceDirFile = new File(sourceDir);
        if (sourceDirFile.exists()) {

            List<File> sourceFiles = Arrays.asList(sourceDirFile.listFiles());

            File targetFile;
            for (File sourceFile : sourceFiles) {

                //skopiuj wszystkie pliki, pomiń te które istnieją
                if (!sourceFile.isDirectory()) {
                    targetFile = FileUtils.joinPaths(targetDirFile, sourceFile.getName());
//                    File targetFile = new File(targetFilePath);
                    if (targetFile.exists()) {
                        LOGGER.debug("File {} already exists - deleting", sourceFile.getPath());
                        targetFile.delete();
//                        continue;
                    }

                    LOGGER.debug("Coping {}", sourceFile.getPath());

                    InputStream is = new BufferedInputStream(new FileInputStream(sourceFile));
                    OutputStream os = new BufferedOutputStream(new FileOutputStream(targetFile));
                    byte[] buffer = new byte[4096];

                    for (;;) {
                        int bytesRead = is.read(buffer);
                        if (bytesRead < 0) {
                            break;
                        }
                        os.write(buffer, 0, bytesRead);
                    }
                    //wyczyść bufor zapisu i zamknij strumienie
                    os.flush();
                    os.close();
                    is.close();
                }
            }
        }
    }
}
